//给定一种规律 pattern 和一个字符串 s ，判断 s 是否遵循相同的规律。 
//
// 这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 
//
// 
//
// 示例1: 
//
// 
//输入: pattern = "abba", s = "dog cat cat dog"
//输出: true 
//
// 示例 2: 
//
// 
//输入:pattern = "abba", s = "dog cat cat fish"
//输出: false 
//
// 示例 3: 
//
// 
//输入: pattern = "aaaa", s = "dog cat cat dog"
//输出: false 
//
// 
//
// 提示: 
//
// 
// 1 <= pattern.length <= 300 
// pattern 只包含小写英文字母 
// 1 <= s.length <= 3000 
// s 只包含小写英文字母和 ' ' 
// s 不包含 任何前导或尾随对空格 
// s 中每个单词都被 单个空格 分隔 
// 
//
// Related Topics 哈希表 字符串 👍 624 👎 0


package LeetCode.editor.cn;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ldltd
 * @date 2023-12-20 00:36:19
 * @description 290.单词规律
 */
public class WordPattern{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new WordPattern().new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean wordPattern(String pattern, String s) {
		//用正则似乎会增加耗时
		String[] split = s.split("\\s+");
		if(split.length!=pattern.length()) return false;
		Map<Character,String> map1=new HashMap<>();
		Map<String,Character> map2=new HashMap<>();
		for (int i = 0; i < pattern.length(); i++) {
			Character c=pattern.charAt(i);
			String str=split[i];
			if (map1.containsKey(c)) {
				if (!map1.get(c).equals(str)) {
					return false;
				}
			}
			if (map2.containsKey(str)) {
				if (!map2.get(str).equals(c)) {
					return false;
				}
			}
			map1.put(c, str);
			map2.put(str, c);
		}
		return true;
	}

	//判断字符和字符串第一次出现的位置是否相等，不同就false
	public boolean wordPattern1(String pattern, String s) {
		List<String> ls = Arrays.asList(s.split(" "));
		int n = pattern.length();
		if (n != ls.size()) return false;
		for (int i = 0; i < n; i++) {
			if (pattern.indexOf(pattern.charAt(i)) != ls.indexOf(ls.get(i)))
				return false;
		}
		return true;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
